/**
 * CSV导出工具类
 */
export class CSVExporter {
  /**
   * 将数据导出为CSV文件
   * @param {Array} data - 要导出的数据数组
   * @param {Array} columns - 列配置数组 [{key: 'field', title: '标题', formatter: fn}]
   * @param {string} filename - 文件名（不含扩展名）
   */
  static exportToCSV(data, columns, filename = 'export') {
    if (!data || data.length === 0) {
      throw new Error('没有数据可导出')
    }

    // 构建CSV内容
    const csvContent = this.buildCSVContent(data, columns)
    
    // 创建并下载文件
    this.downloadCSV(csvContent, filename)
  }

  /**
   * 构建CSV内容
   * @param {Array} data - 数据数组
   * @param {Array} columns - 列配置
   * @returns {string} CSV内容
   */
  static buildCSVContent(data, columns) {
    // 构建表头
    const headers = columns.map(col => col.title || col.key)
    const csvRows = [headers.join(',')]

    // 构建数据行
    data.forEach(row => {
      const csvRow = columns.map(col => {
        let value = row[col.key]
        
        // 应用格式化函数
        if (col.formatter && typeof col.formatter === 'function') {
          value = col.formatter(value, row)
        }
        
        // 处理特殊字符和空值
        value = this.formatCSVValue(value)
        
        return value
      })
      
      csvRows.push(csvRow.join(','))
    })

    return csvRows.join('\n')
  }

  /**
   * 格式化CSV值
   * @param {any} value - 要格式化的值
   * @returns {string} 格式化后的值
   */
  static formatCSVValue(value) {
    if (value === null || value === undefined) {
      return ''
    }
    
    // 转换为字符串
    let strValue = String(value)
    
    // 如果包含逗号、双引号或换行符，需要用双引号包围
    if (strValue.includes(',') || strValue.includes('"') || strValue.includes('\n')) {
      // 转义双引号
      strValue = strValue.replace(/"/g, '""')
      // 用双引号包围
      strValue = `"${strValue}"`
    }
    
    return strValue
  }

  /**
   * 下载CSV文件
   * @param {string} csvContent - CSV内容
   * @param {string} filename - 文件名
   */
  static downloadCSV(csvContent, filename) {
    // 添加BOM以支持中文
    const BOM = '\uFEFF'
    const csvWithBOM = BOM + csvContent
    
    // 创建Blob对象
    const blob = new Blob([csvWithBOM], { type: 'text/csv;charset=utf-8;' })
    
    // 创建下载链接
    const link = document.createElement('a')
    const url = URL.createObjectURL(blob)
    
    link.setAttribute('href', url)
    link.setAttribute('download', `${filename}_${this.formatDate(new Date())}.csv`)
    link.style.visibility = 'hidden'
    
    // 触发下载
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    
    // 释放URL对象
    URL.revokeObjectURL(url)
  }

  /**
   * 格式化日期为文件名格式
   * @param {Date} date - 日期对象
   * @returns {string} 格式化的日期字符串
   */
  static formatDate(date) {
    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')
    const hours = String(date.getHours()).padStart(2, '0')
    const minutes = String(date.getMinutes()).padStart(2, '0')
    
    return `${year}${month}${day}_${hours}${minutes}`
  }
}

/**
 * 交易记录CSV导出配置
 */
export const tradeExportColumns = [
  {
    key: 'tradeid',
    title: '交易ID'
  },
  {
    key: 'cardid',
    title: '银行卡号',
    formatter: (value) => {
      if (!value) return ''
      return value.replace(/(\d{4})(?=\d)/g, '$1 ')
    }
  },
  {
    key: 'tradetype',
    title: '交易类型'
  },
  {
    key: 'trademoney',
    title: '交易金额',
    formatter: (value) => {
      return `¥${Number(value || 0).toLocaleString()}`
    }
  },
  {
    key: 'tradedate',
    title: '交易时间',
    formatter: (value) => {
      if (!value) return '-'
      return new Date(value).toLocaleString('zh-CN')
    }
  },
  {
    key: 'remark',
    title: '备注',
    formatter: (value) => value || '-'
  }
]

/**
 * 客户记录CSV导出配置
 */
export const customerExportColumns = [
  {
    key: 'userid',
    title: '用户ID'
  },
  {
    key: 'username',
    title: '用户名'
  },
  {
    key: 'pid',
    title: '身份证号'
  },
  {
    key: 'gender',
    title: '性别'
  },
  {
    key: 'telephone',
    title: '联系电话'
  },
  {
    key: 'account',
    title: '登录账号'
  },
  {
    key: 'role',
    title: '角色',
    formatter: (value) => {
      return value === 1 ? '管理员' : '普通用户'
    }
  }
]

/**
 * 银行卡记录CSV导出配置
 */
export const cardExportColumns = [
  {
    key: 'cardid',
    title: '银行卡号',
    formatter: (value) => {
      if (!value) return ''
      return value.replace(/(\d{4})(?=\d)/g, '$1 ')
    }
  },
  {
    key: 'customername',
    title: '持卡人'
  },
  {
    key: 'balance',
    title: '余额',
    formatter: (value) => {
      return `¥${Number(value || 0).toLocaleString()}`
    }
  },
  {
    key: 'curid',
    title: '币种'
  },
  {
    key: 'savingid',
    title: '存款类型ID'
  },
  {
    key: 'isreportloss',
    title: '状态',
    formatter: (value) => {
      return value === '否' ? '正常' : '已挂失'
    }
  },
  {
    key: 'opendate',
    title: '开卡时间',
    formatter: (value) => {
      if (!value) return '-'
      return new Date(value).toLocaleDateString('zh-CN')
    }
  }
]

/**
 * 存款类型CSV导出配置
 */
export const depositExportColumns = [
  {
    key: 'savingid',
    title: '存款ID'
  },
  {
    key: 'savingname',
    title: '存款类型'
  },
  {
    key: 'descrip',
    title: '描述'
  }
]

/**
 * 用户端交易记录CSV导出配置
 */
export const userTradeExportColumns = [
  {
    key: 'tradeid',
    title: '交易流水号'
  },
  {
    key: 'tradedate',
    title: '交易时间',
    formatter: (value) => {
      if (!value) return '-'
      return new Date(value).toLocaleString('zh-CN')
    }
  },
  {
    key: 'tradetype',
    title: '交易类型'
  },
  {
    key: 'cardid',
    title: '银行卡号',
    formatter: (value) => {
      if (!value) return ''
      return value.replace(/(\d{4})(?=\d)/g, '$1 ')
    }
  },
  {
    key: 'trademoney',
    title: '交易金额',
    formatter: (value, row) => {
      const absAmount = Math.abs(Number(value))
      if (row.tradetype === '存款' || (row.tradetype === '转账' && value > 0)) {
        return `+¥${absAmount.toLocaleString()}`
      } else if (row.tradetype === '取款' || (row.tradetype === '转账' && value < 0)) {
        return `-¥${absAmount.toLocaleString()}`
      }
      return `¥${absAmount.toLocaleString()}`
    }
  },
  {
    key: 'remark',
    title: '备注',
    formatter: (value) => value || '-'
  }
] 